package com.dayuanit.dy17.mix.proxy;

import com.dayuanit.dy17.mix.proxy.dynamicproxy.TransactionalInvocationHandler;
import com.dayuanit.dy17.mix.proxy.service.IPayService;
import com.dayuanit.dy17.mix.proxy.service.IUserService;
import com.dayuanit.dy17.mix.proxy.service.impl.PayServiceImpl;
import com.dayuanit.dy17.mix.proxy.service.impl.UserServiceImpl;

import java.lang.reflect.Proxy;

public class TestTranscaction {
    public static void main(String[] args) {

        //jdk动态代理 局限性：目标类必须实现接口，若木有接口，则无法使用jdk动态代理。
        //spring的AOP，就是来解决动态代理难写，难维护，上手困难的问题，以及目标类木有
        //接口无法代理的问题。AOP通通为我们解决，它让代理变得简简单单。
        IPayService payService = (IPayService)Proxy.newProxyInstance(TestTranscaction.class.getClassLoader(),
                new Class[]{IPayService.class},
                new TransactionalInvocationHandler(new PayServiceImpl()));

//        payService.pay();

//        payService.recharge(200);
//        System.out.println(payService.getClass().getName());

//        payService.queryBalance();


//        IPayService payService = new PayServiceImpl();
//        payService.recharge(500);
//        System.out.println(payService.getClass().getName());

        IUserService userService = (IUserService) Proxy.newProxyInstance(TestTranscaction.class.getClassLoader(),
                new Class[]{IUserService.class},
                new TransactionalInvocationHandler(new UserServiceImpl()));

        userService.login("tom", "111");
        System.out.println(userService.getClass().getName());
    }
}
